package com.hanzidong.utils;

import java.io.File;

public class FileUtil {

	/**
	* 功能：获取操作用户当前目录。
	*
	* @return 操作系统用户目录
	*/
	public static File getUserDir() {
		//获取用户当前目录的路径
		String path = System.getProperty("user.dir");
		
		return new File(path);
	}
	
	/**
	* 功能：获取操作系统用户目录。
	*
	* @return 操作系统用户目录
	*/
	public static File getUserHomeDir() {
		//获取用户当前目录的路径
		String path = System.getProperty("user.home");
		
		return new File(path);
	}
	
	/**
	* 功能：获取操作系统临时目录。
	*
	* @return 操作系统临时目录
	*/
	public static File getTmpDir() {
		//获取用户当前目录的路径
		String path = System.getProperty("java.io.tmpdir");
		
		return new File(path);
	}
	
	/**
	* 功能：获取一个文件的根目录
	* 举例：d:\temp\2020\04\abc.jpg → d:
	*
	* @param File file 文件名
	* @return 该文件的根目录
	*/
	public static File getRoot(File file) {
		//获取文件的路径
		String path = file.getPath();
		
		//根据:进行截取
		String substring = path.substring(0, path.indexOf(":") + 1 );
		
		return new File(substring);
	}
	
	/**
	* 功能：获取一个文件的根目录
	*
	* @return 当前根目录
	*/
	public static File getRoot() {
		//获取当前所在目录
		File userDir = getUserDir();
		
		//根据当前所在目录，获取其根目录
		return getRoot(userDir);
	}
	
	/**
	* 功能：获取文件扩展名
	* 示例：a.jpg → .jpg   
	*
	* @param String fileName 文件名
	* @return 带点的扩展名
	*/
	public static String getFileExtensions(String fileName) {
		//获取文件最后一个.的下标
		int index = fileName.lastIndexOf(".");
		
		if(index < 0 ) {
			return "文件名不正确";
		}
		
		//根据下标截取
		String file_exten = fileName.substring(index);
		
		return file_exten;
	}
	
	/**
	* 功能：获取对应单位的文件大小
	* 示例：a.jpg文件原始大小是1275个字节，如果参数单位是k，则返回2K，如果m，则返回0M   
	*
	* @param File file 文件
	* @param FileSizeUnit unit 单位，如K、M、G、T
	* @return 对应单位的文件大小
	*/
	public static long getFileSize(File file, FileSizeUnit unit) {
		//获取文件的字节大小
		long length = file.length();
		
		//根据传过来的单位，计算对应的数据
		return length/unit.getCode();
	}
	
	/**
	* 功能：获取某文件所在磁盘的总空间
	* 示例：如果传了d:\temp\a.jpg文件，能计算出d盘的总空间
	*
	* @param File file 文件
	* @param FileSizeUnit unit 单位，如K、M、G、T
	* @return 对应单位的文件大小
	*/
	public static long getTotalSpace(File file, FileSizeUnit unit) {
		//获取磁盘根目录
		File root = getRoot(file);
		
		//获取总大小
		long totalSpace = root.getTotalSpace();
		
		//根据传过来的单位，计算对应的数据
		return totalSpace/unit.getCode();
	}
	
	/**
	* 功能：获取磁盘的总空间
	*
	* @param FileSizeUnit unit 单位，如K、M、G、T
	* @return 磁盘的可用空间大小
	*/
	public static long getFreeSpace(FileSizeUnit unit) {
		//获取磁盘根目录
		File root = getRoot();
		
		//获取总大小
		long freeSpace = root.getFreeSpace();
		
		//根据传过来的单位，计算对应的数据
		return freeSpace/unit.getCode();
	}
	
	/**
	* 功能：递归删除文件，如果是目录，则目录下所有的文件和子目录都删除。
	*
	* @param File file 文件或文件夹
	*/
	public static void deletes(File file) {
		//获取其下子文件和子目录
		File[] files = file.listFiles();
		
		if(files != null && files.length > 0 ) {
			//循环遍历
			for (File f : files) {
				//如果是文件，直接删除
				if(f.isFile()) {
					f.delete();
				}else {
					//如果是目录，使用递归调用
					deletes(f);
				}
			}
		}
		
		//将文件夹或者文件本身删除
		file.delete();
	}
}
